﻿#ifndef SCREENCAMERA_PRIVATE_H
#define SCREENCAMERA_PRIVATE_H

#include <QThread>
#include <QScreen>
#include "CameraScreenInfo.h"

namespace Qly{
/**
 * @brief The ScreenCamera_private class 将截屏功能封装成一个相机，可以像相机一样的操作。
 */
class CameraScreen_private : public QThread
{
    Q_OBJECT
public:
    explicit CameraScreen_private(QObject *parent = 0);
    explicit CameraScreen_private(CameraScreenInfo &info, QObject *parent = 0);
    /**
     * @brief openDevice 打开一个特定的截屏相机，当计算机连接了多个显示器时通过这个 info 指定截取某一个屏幕的图像
     * @param info
     * @return
     */
    bool openDevice(const CameraScreenInfo &info);
    bool openDevice(QScreen *screen);
    /**
     * @brief setFrameRate 设置定时截屏的帧率。这里模仿相机的帧率设置。
     * @param fps  frame per second 每秒的截屏数量。 [0.001 - 50]
     */
    void setFrameRate(double fps);
    /**
     * @brief setRoi 设置感兴趣的区域，利用这个函数我们可以只截取屏幕的一部分区域
     * @param x 截屏区域的起始X坐标
     * @param y 截屏区域的起始Y坐标
     * @param width 截屏区域的宽度，-1 表示完整的屏幕宽度
     * @param height 截屏区域的高度，-1 表示完整的屏幕高度
     */
    void setRoi(int x, int y, int width, int height);
    void run() Q_DECL_OVERRIDE;
    /**
     * @brief capture 获取截屏图像
     * @return
     */
    QImage capture();
signals:
    /**
     * @brief imageChanged 定时截取图像时没截取一帧图像就激发一次这个信号
     * @param image
     */
    void imageChanged(const  QImage& image);
public slots:
    /**
     * @brief start 开始图像采集
     */
    void start();
    /**
     * @brief stop 停止图像采集
     */
    void stop();

private:
    int m_sleepInterval;
    QScreen* m_screen;
    int m_x;
    int m_y;
    int m_width;
    int m_height;
};
}

#endif // SCREENCAMERA_PRIVATE_H
